/**
 * @(#)RecursosFinancierosManagerK.java Mar 15, 2007
 *
 * Copyright (c) 2005-2010 Psiqueware S.A. de C.V. All Rights Reserved.
 * This software is the proprietary information Psiqueware S.A. de C.V.
 * Use is subject to license terms.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *
 * <br/>Usuario : Psique
 * <br/>Creaci&oacute;n: Mar 15, 2007 - 7:57:20 PM
 * <br/>
 * <br/>
 * <br/><t5>Cambios :</t5>
 * <br/><b>Fecha | Autor  |  Cambios</b>
 * <ul>
 * <li>Mar 15, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Creaci&oacute;n del Objeto.</li>
 * <li>Abr 19, 2007 | <a href = "mailto:AngelElectrico@PsiqueWare.com">Psique</a> | Se eliminar&oacute;n las referencias a las clases Empresa, Deportamento, etc y se cambiar&oacute;n por referencias a Estructura.</li>
 * </ul>
 */

package com.psiqueware.jazmin.empresas.recursos.financieros.manager;

import com.psiqueware.alheli.exception.NullArgumentException;
import com.psiqueware.alheli.dao.EnlaceTransaccional;
import com.psiqueware.alheli.logging.Logger;
import com.psiqueware.alheli.logging.LoggerFactory;
import com.psiqueware.alheli.manager.BaseManager;
import com.psiqueware.alheli.manager.ManagerException;
import com.psiqueware.alheli.seguridad.Llave;
import com.psiqueware.alheli.seguridad.Modulo;
import com.psiqueware.alheli.seguridad.ModulosManager;
import com.psiqueware.alheli.seguridad.SeguridadException;
import com.psiqueware.alheli.seguridad.SeguridadManagerFactory;
import com.psiqueware.alheli.seguridad.UsuarioSeguridad;
import com.psiqueware.jazmin.empresas.recursos.financieros.CentroCostos;
import com.psiqueware.jazmin.empresas.recursos.financieros.RecursosFinancierosManager;
import com.psiqueware.jazmin.empresas.recursos.financieros.dao.CentroCostosDAO;
import com.psiqueware.jazmin.empresas.recursos.financieros.dao.RecursosFinancierosDAOFactory;
import com.psiqueware.jazmin.empresas.recursos.financieros.modelo.CentroCostosK;
import com.psiqueware.manzanilla.informacion.documentos.Documento;
import com.psiqueware.manzanilla.informacion.documentos.DocumentosManager;
import com.psiqueware.manzanilla.informacion.documentos.DocumentosManagerFactory;
import com.psiqueware.tulipan.organizacional.Estructura;

import java.util.List;

/**
 * Encargado de administrar los recursosfinancieros.
 * <br/>Paquete Original: com.psiqueware.laVIE.empresas.recursos.financieros.manager
 * <br/>Nombre  Original: RecursosFinancierosManagerK
 * <br/>Oprima para ver : <a href="RecursosFinancierosManagerK.java.html"><i>C&oacute;digo Fuente</i> </a>
 *
 * @author <a href="mailto:AngelElectrico@PsiqueWare.com">Psique</a>
 * @version Revision: 1.1 Mar 15, 2007 7:57:20 PM
 * @noinspection CastToConcreteClass,FeatureEnvy,BooleanMethodNameMustStartWithQuestion,ClassWithoutToString,DuplicateStringLiteralInspection
 */
public class RecursosFinancierosManagerK extends BaseManager implements Modulo, RecursosFinancierosManager
{


    /** Logger de clase para RecursosFinancierosManagerK */
    private static final Logger s_log = LoggerFactory.getLogger ( RecursosFinancierosManagerK.class );

    /** Encargado de la Seguridad del Modulo. */
    private ModulosManager m_seguridadModulosManager = SeguridadManagerFactory.getModulosManager ();

    /** Manager para crear documentos. */
    private DocumentosManager m_documentosManager = DocumentosManagerFactory.getDocumentosManager ();

    /** DAO de {@link CentroCostos}. */
    private  CentroCostosDAO m_centroCostosDAO = RecursosFinancierosDAOFactory.findDAOCentroCostos ();

    /** De seguridad para este modulo. */
    private Llave m_llave;

    /** Constructor de RecursosFinancierosManagerK. */
    public RecursosFinancierosManagerK ()
    {
        try
        {
            m_seguridadModulosManager.registrarModulo ( this );
        }
        catch ( SeguridadException e )
        {
            final String error = "<error><msg>No se pudo crear el RecursosFinancierosManagerK.</msg></error>";
            s_log.error ( error );
            s_log.error ( e );
            throw new RuntimeException ( error, e );
        }
    }


    /**
     * Crea una nueva {@link CentroCostos} y la agrega a la {@link Estructura}.
     * <br/>
     * Solo los {@link UsuarioSeguridad} que tengan el {@link Permiso} de {@link RecursosFinancierosManagerK#s_cambiarRecursosFinancieros}
     * podr&aacute;n alterar la estructura de la empresa y crearla.
     * <br/>
     * Solo se puede crear una {@link CentroCostos} para una clave dada en una misma {@link Estructura}.
     *
     * @param analistaFinanciero  {@link UsuarioSeguridad} que prentende realizar los cambios en la Empresa.
     * @param clave               para la {@link CentroCostos}. Dos claves no pueden repetirse enuna misma {@link Estructura}.
     * @param departamento        donde se pretende agregar la {@link CentroCostos}.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @return {@link CentroCostos} con su clave, como parte del {@link Estructura}. Si el {@link UsuarioSeguridad} reestructurador no tienen el {@link Permiso} devuelve <code>null</code>.
     *
     * @exception ManagerException en caso de no poder completar la operaci&oacute;n.
     * @see #s_cambiarRecursosFinancieros
     */
    public CentroCostos agregarCentroCostos ( UsuarioSeguridad analistaFinanciero, Estructura departamento, String clave, EnlaceTransaccional enlaceTransaccional ) throws ManagerException
    {
        try
        {
            CentroCostosK centroCostosK = null;
            if ( m_llave.isHabilitadoActividad ( s_cambiarRecursosFinancieros, analistaFinanciero ) )
            {
                //validamos
                if ( null == departamento ) throw new NullArgumentException ( "<error>El argumento 'departamento' no puede ser NULL.</error>" );
                if ( null == departamento.getId () ) throw new NullArgumentException ( "<error>El argumento 'departamento' deb&iacute;a encontrarse previamente persistido.</error>" );
                //Actualizamos nuestros objetos
                final Documento descripcion = m_documentosManager.nuevoDocumento ( enlaceTransaccional );
                centroCostosK = new CentroCostosK ( descripcion, departamento );

                //guardamos los cambios. Primero el CentroCostos pues para guardarla en la area debe tener un id.
                m_centroCostosDAO.saveCentroCostos ( centroCostosK, enlaceTransaccional );
                describirCentroCostos ( analistaFinanciero, centroCostosK, clave, enlaceTransaccional );
            }
            return centroCostosK;
        }
        catch ( Exception e )
        {
            enlaceTransaccional.rollBack ();
            String error = "<error><msg>No se pudo agregar el CentroCostos</msg><parametros>" + departamento + "</parametros></error>";
            s_log.error ( error );
            s_log.error ( e );
            throw new ManagerException ( error, e );
        }
    }

    /**
     * Realiza la descripci&oacute;n de este {@link CentroCostos} asign&aacute;ndole una nueva clave.
     *
     * @param centrocostos        a describir.
     * @param clave               nueva a asignarle. No puede ser <code>null</code> ni vacio ni existir ya de alta dentro ese {@link Estructura} al que pertenece este {@link Centrocostos}.
     * @param analistaFinanciero  {@link UsuarioSeguridad} que va a realizar la operacion.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @return <code>true</code> si se pudo realizar el cambio; <code>false</code> en caso contrario.
     *
     * @exception ManagerException en caso de no poder completar la operaci&oacute;n.
     * @noinspection CallToStringEqualsIgnoreCase
     * @see #s_cambiarRecursosFinancieros
     */
    public boolean describirCentroCostos ( UsuarioSeguridad analistaFinanciero, CentroCostos centrocostos, String clave, EnlaceTransaccional enlaceTransaccional ) throws ManagerException
    {
        try
        {
            boolean salida = false;
            if ( m_llave.isHabilitadoActividad ( s_cambiarRecursosFinancieros, analistaFinanciero ) )
            {

                //validamos
                if ( null == centrocostos ) throw new NullArgumentException( "<error>El argumento 'centrocostos' no puede ser NULL.</error>" );
                if ( null == clave ) throw new NullArgumentException ( "<error>El argumento 'clave' no puede ser NULL.</error>" );
                if ( 0 == clave.trim ().length () ) throw new IllegalArgumentException ( "<error>El argumento 'clave' es una cadena vacia.</error>" );

                List<CentroCostos> centros= m_centroCostosDAO.findCentroCostosPorIdEstructura ( centrocostos.getIdEstructura (), enlaceTransaccional );
                for ( CentroCostos otros : centros )
                {
                    if ( clave.equalsIgnoreCase ( otros.getClave () ) ) throw new IllegalArgumentException ( "<error><msg>La clave del CentroCostos ya existia en este Estructura.</msg><parametros>" + clave + "</parametros></error>" );
                }

                //creamos
                CentroCostosK geK = ( CentroCostosK ) centrocostos;
                geK.setClave ( clave );
                //persistimos
                m_centroCostosDAO.updateCentroCostos ( geK, enlaceTransaccional );
                salida = true;
            }
            return salida;
        }
        catch ( Exception e )
        {
            String error = "<error><msg>No se pudo guardar la descripci&oacute;n del Centrocostos.</msg><parametros></parametros></error>";
            s_log.error ( error );
            s_log.error ( e );
            enlaceTransaccional.rollBack ();
            throw new ManagerException ( error, e );
        }
    }

    /**
     * Lista todos los {@link CentroCostos} asociados a una {@link Estructura}.
     *
     * @param estructura          cuyos {@link CentroCostos} se buscan.
     * @param enlaceTransaccional para asegurar la atomicidad de la transacci&oacute;n.
     *
     * @return {@link List} de {@link CentroCostos}, vacia si no se encuentran.
     *
     * @exception com.psiqueware.alheli.manager.ManagerException
     *             en caso de no poder completar la operaci&oacute;n.
     */
    public List<CentroCostos> buscarCentrosCostos ( Estructura estructura, EnlaceTransaccional enlaceTransaccional ) throws ManagerException
    {
        try
        {
            return m_centroCostosDAO.findCentroCostosPorIdEstructura ( estructura.getId (), enlaceTransaccional );
        }
        catch ( Exception e )
        {
            final String error = "<error><msg>No se pudier&oacute;n listar los CentroCostos</msg><parametros>"+estructura+"</parametros></error>";
            s_log.error ( error );
            s_log.error ( e );
            enlaceTransaccional.rollBack ();
            throw new RuntimeException ( error, e );

        }

    }

    /**
     * Asigna la Llave a Modulo.
     * <p><b>Para uso exclusivo del componente se Seguridad.</b></p>
     *
     * @param llave a asignar.
     */
    public void setLlave ( Llave llave )
    {
        m_llave = llave;
    }

    /**
     * Devuelve la LlaveK del la clase.
     *
     * @return LlaveK.
     */
    public Llave getLlave ()
    {
        return m_llave;
    }
}

